#-*- codeing = utf-8 -*-
#@Time : 2020/11/24 18:52
#@Author : 阳某
#@File : 01.函数基础.py
#@Software : PyCharm

def add(a,b=3):#缺省值
    return a+b
c = add(1)
print(c)

d = str(c)
if not d.isdigit():     #  not   >   and  >   or
    print('不是数字')

'''
内置函数
abs()	dict()	help()	min()	setattr()
all()	dir()	hex()	next()	slice()
any()	divmod()	id()	object()	sorted()
ascii()	enumerate()	input()	oct()	staticmethod()
bin()	eval()	int()	open()	str()
bool()	exec()	isinstance()	ord()	sum()
bytearray()	filter()	issubclass()	pow()	super()
bytes()	float()	iter()	print()	tuple()
callable()	format()	len()	property()	type()
chr()	frozenset()	list()	range()	vars()
classmethod()	getattr()	locals()	repr()	zip()
compile()	globals()	map()	reversed()	__import__()
complex()	hasattr()	max()	round()	 
delattr()	hash()	memoryview()	set()
'''


studentInfo = {
    '张飞' :  18,
    '赵云' :  17,
    '许褚' :  16,
    '典韦' :  18,
    '关羽' :  19,
}

def  printAge(students) :
    for  student in students:
        print( f'学生：{student} , 年龄 {studentInfo[student]}')

printAge(['张飞', '典韦', '关羽'])
printAge(['赵云'])

# 效果和前面一种定义完全一样。
#
# 这种前面加一个星号的参数，称之为可变参数，
# Python解释器创建一个 tuple 赋值给这个 students，里面存放了 ‘张飞’, ‘典韦’, ‘关羽’ 三个字符串对象作为元素，
#
# 我们在代码里加入一行语句，显示 students 类型
# 在调用该函数的时候，Python解释器会创建一个 tuple 赋值给这个参数变量。并且会把 传入的数据对象 放到这个tuple对象里面。
def  printAge(*students) :
    print(type(students))
    for  student in students:
        print( f'学生：{student} , 年龄 {studentInfo[student]}')

printAge('张飞', '典韦', '关羽')
'''
printAge 使用上面这样的可变参数，假如我们要传入的参数恰好已经在一个list（或者tuple） 中，比如
onebatch = ['张飞', '典韦', '关羽']
怎么调用printAge呢？
当然可以这样
printAge (onebatch[0], onebatch[1], onebatch[2])
显然不方便。
其实，我们可以这样
printAge(*onebatch)
在调用时，这就是参数展开。
我们可以将其等价于
printAge (onebatch[0], onebatch[1], onebatch[2])
大家注意，这里是在调用函数的时候,传入参数前面加上星号，是参数展开；
前面我们讲的可变参数是在函数定义的时候前面加上星号。
'''



# 关键字可变参数
# 参数个数不确定，除了上面这种定义的方式，还有另外一种定义方式，叫做关键字可变参数。
# 比如，我们要实现一个函数，可以在 学生年龄表里面添加新的学生信息， 可以输入不定数量的学生信息，包括姓名和年龄。

def addStudents(table,**students):
    print(type(students))
    for name,age in students.items():
        table[name] = age

table1 = {}
table2 = {}
addStudents(table1, 李白=20, 杜甫=24)
addStudents(table2, Jodan=45, James=32, onil=40)
print(table1)
print('----------------')
print(table2)

'''
其中 <class 'dict'> 说明了 前面有两个星号 的 参数变量 students 的值是一个字典。
这种前面加2个星号的参数，称之为关键字可变参数，
在调用该函数的时候，Python解释器会创建一个 dict （字典） 赋值给这个参数变量。
并且会把 传入的数据对象 分别放到这个dict 对象里面。
传入的参数对象，必须是像 name=value这种 带参数名和参数值的， 放到dict对象时，参数名是字典元素的key，参数值是字典元素的value。
也就是说，上面的例子里面，如下调用代码执行的时候，
addStudents(table1, 李白=20, 杜甫=24)
Python解释器创建一个 字典 赋值给参数变量 students，把 李白，20 和 杜甫，24 作为 2个键值对元素放到 该字典中。
addStudents 使用上面这样的关键字可变参数，假如我们要传入的参数恰好已经在一个字典 中，比如
onebatch = {'李白': 20, '杜甫': 24}
怎么调用addStudents呢？
可以这样参数展开
onebatch = {'李白': 20, '杜甫': 24}
addStudents(table1, **onebatch)
和上面不同的是，对字典，要使用两个星号进行参数参开，Python解释器会把字典里面，每个元素的键作为参数名，值作为参数值，这样进行函数调用
'''